namespace SmartMathLibrary
{
    /// <summary>
    /// Interface to implement an ComplexPoint3D class.
    /// </summary>
    public interface IComplexPoint3D
    {
        /// <summary>
        /// Gets or sets the x value of the complex point.
        /// </summary>
        /// <value>The x value of the complex point.</value>
        ComplexNumber X { get; set; }

        /// <summary>
        /// Gets or sets the y value of the complex point.
        /// </summary>
        /// <value>The y value of the complex point.</value>
        ComplexNumber Y { get; set; }

        /// <summary>
        /// Gets or sets the z value of the complex point.
        /// </summary>
        /// <value>The z value of the complex point.</value>
        ComplexNumber Z { get; set; }

        /// <summary>
        /// Adds a x, y and z value to the current point instance.
        /// </summary>
        /// <param name="xValue">The x value.</param>
        /// <param name="yValue">The y value.</param>
        /// <param name="zValue">The y value.</param>
        void Add(double xValue, double yValue, double zValue);

        /// <summary>
        /// Adds a x, y and z value to the current point instance.
        /// </summary>
        /// <param name="xValue">The x value.</param>
        /// <param name="yValue">The y value.</param>
        /// <param name="zValue">The y value.</param>
        void Add(ComplexNumber xValue, ComplexNumber yValue, ComplexNumber zValue);

        /// <summary>
        /// Copies the current instance of the complex point.
        /// </summary>
        /// <returns>A copy of the current complex point instance.</returns>
        ComplexPoint3D Copy();

        /// <summary>
        /// Scales the position elements x, y and z with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTransformation(double scaleFactor);

        /// <summary>
        /// Scales the position elements x, y and z with a specified factor.
        /// </summary>
        /// <param name="scaleFactor">The scale factor.</param>
        void ScaleTransformation(ComplexNumber scaleFactor);

        /// <summary>
        /// Scales the position elements x, y and z with a specified factor.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        /// <param name="scaleFactorZ">The scale factor for the z position.</param>
        void ScaleTransformation(double scaleFactorX, double scaleFactorY, double scaleFactorZ);

        /// <summary>
        /// Scales the position elements x, y and z with a specified factor.
        /// </summary>
        /// <param name="scaleFactorX">The scale factor for the x position.</param>
        /// <param name="scaleFactorY">The scale factor for the y position.</param>
        /// <param name="scaleFactorZ">The scale factor for the z position.</param>
        void ScaleTransformation(ComplexNumber scaleFactorX, ComplexNumber scaleFactorY, ComplexNumber scaleFactorZ);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValue">The translate value for the x-, y- and z position.</param>
        void TranslateTransformation(double translateValue);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValue">The translate value for the x-, y- and z position.</param>
        void TranslateTransformation(ComplexNumber translateValue);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValueX">The translate value for x position.</param>
        /// <param name="translateValueY">The translate value for y position.</param>
        /// <param name="translateValueZ">The translate value for z position.</param>
        void TranslateTransformation(double translateValueX, double translateValueY, double translateValueZ);

        /// <summary>
        /// Translates the point position.
        /// </summary>
        /// <param name="translateValueX">The translate value for x position.</param>
        /// <param name="translateValueY">The translate value for y position.</param>
        /// <param name="translateValueZ">The translate value for z position.</param>
        void TranslateTransformation(ComplexNumber translateValueX, ComplexNumber translateValueY,
                                     ComplexNumber translateValueZ);

        /// <summary>
        /// Converts the current point to a complex vector.
        /// </summary>
        /// <returns>The converted complex vector.</returns>
        GeneralComplexVector ToVector();

        /// <summary>
        /// Converts the current point to a complex matrix.
        /// </summary>
        /// <returns>The converted complex matrix.</returns>
        ComplexMatrix ToMatrix();
    }
}